"""
Pandas添加了特殊的groupby行为，称为“命名聚合”，用于在将多个聚合函数应用于特定列时命名输出列
"""

import pandas as pd
import numpy as np

animals = pd.DataFrame({'kind': ['cat', 'dog', 'cat', 'dog'],
                        'height': [9.1, 6.0, 9.5, 34.0],
                        'weight': [7.9, 7.5, 9.9, 198.0]})

ret = animals.groupby("kind").agg(
    min_height=pd.NamedAgg(column="height", aggfunc="min"),
    max_height=pd.NamedAgg(column="height", aggfunc="max"),
    average_weight=pd.NamedAgg(column="weight", aggfunc=np.mean)
)
print(ret)

# 将所需的列名称作为 **kwargs 传递给 .agg。
# **kwargs 的值应该是元组，其中第一个元素是列选择，第二个元素是要应用的聚合函数。
# Pandas提供了pandas.NamedAgg （命名为元组），使函数的参数更清晰，但也接受了普通元组。
ret2 = animals.groupby("kind").agg(
    min_height=("height", "min"),
    max_height=("height", "max"),
    average_weight=("weight", np.mean)
)
print(ret2)

ret3 = animals.groupby("kind").height.agg(
    min_height="min",
    max_height="max"
)
print(ret3)
